package main

import (
	"fmt"
	"math"
)

/*
匿名结构体和匿名字段介绍

无须通过type关键字定义就可以直接使用，【创建匿名结构体时，同时要创建对象】。匿名结构体由结构体定义和键值对初始化两部分组成
*/
func main() {

	/*
		一. 匿名结构体语法格式：
			// 1. 创建匿名结构体时，同时要创建对象 + 初始化
			变量名 := struct {
				// 定义成员属性
			}{
				// 初始化成员属性
			}
			// 2. 创建匿名结构体时，同时要创建对象， 不初始化
			var 变量名 struct {// 定义成员属性 }
	*/
	// 创建匿名结构体时，同时要创建对象 + 初始化
	s := struct {
		province, city string
	}{
		"四川省", "成都市",
	}
	fmt.Println(s)
	// 创建匿名结构体时，同时要创建对象， 不初始化
	var user1 struct {
		Name string
		Age  int
	}
	user1.Name = "4343434"
	user1.Age = 18
	fmt.Printf("%#v\n", user1)

	// 顺便回顾下匿名函数
	f := func(a, b float64) float64 {
		return math.Pow(a, b)
	}(2, 3)
	fmt.Println(f)

	/*
		二. 结构体的匿名字段
		匿名字段就是在结构体中的字段没有名字，只包含一个没有字段名的类型。这些字段被称为匿名字段。
			TIPS：
				· 如果字段没有名字，那么默认使用类型作为字段名；
				· 【同一个类型只能】有一个匿名字段；
				· 结构体嵌套中采用匿名结构体字段可以模拟继承关系
	*/
	user := User{

		"steven",
		'm',
		35,
		178.2,
	}
	fmt.Println(user)
	fmt.Println("姓名：", user.string)
	fmt.Println("性别：", user.byte)
	fmt.Println("身高：", user.float64)
	fmt.Println("年龄：", user.int8)

}

/*
结构体中使用匿名字段
*/
type User struct {
	string
	byte
	int8
	float64
}
